package com.jtbd.dto.result;

import com.jtbd.constants.ResponseCodeEnum;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

/**
 * 响应结果
 *
 * @param <T>
 */
@Data
public class ResponseBaseData<T> {
    @Schema(description = "返回结果状态码")
    private int code;
    @Schema(description = "返回结果信息")
    private String msg;
    @Schema(description = "返回结果数据")
    private T data;

    /**
     * 创建一个表示成功响应的方法，包含成功状态码和消息
     *
     * @param <T>  数据类型泛型，允许返回任意类型的响应数据
     * @param data 响应的成功数据，可以为空
     * @return 包含成功状态码、消息和数据的响应对象
     */
    public static <T> ResponseBaseData<T> success(T data) {
        ResponseBaseData<T> responseBaseData = new ResponseBaseData<>();
        responseBaseData.setCode(ResponseCodeEnum.SUCCESS.getCode());
        responseBaseData.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
        responseBaseData.setData(data);
        return responseBaseData;
    }

    /**
     * 创建一个表示成功响应的方法，该方法携带自定义成功消息
     * 此方法用于当操作成功但不需要返回具体数据时，提供一个统一的响应格式
     *
     * @param msg 自定义的成功消息，用于提供给调用者额外的信息
     * @return ResponseBaseData<Object> 一个泛型为Object的ResponseBaseData实例，用于封装响应数据
     */
    public static ResponseBaseData<Object> successOfMsg(String msg) {
        // 初始化一个泛型为Object的ResponseBaseData实例
        ResponseBaseData<Object> responseBaseData = new ResponseBaseData<>();

        // 设置响应码为成功，从ResponseCodeEnum枚举中获取成功状态码
        responseBaseData.setCode(ResponseCodeEnum.SUCCESS.getCode());

        responseBaseData.setMsg(msg);

        // 设置响应数据为空，因为此方法不返回任何具体数据
        responseBaseData.setData(null);

        // 返回初始化的responseBaseData实例
        return responseBaseData;
    }

    /**
     * 创建一个表示错误响应的方法，包含错误状态码和消息
     *
     * @param <T>              数据类型泛型，允许返回任意类型的响应数据
     * @param responseCodeEnum 表示错误响应的状态码和消息的枚举对象
     * @return 包含错误状态码和消息的响应对象
     */
    public static <T> ResponseBaseData<T> error(ResponseCodeEnum responseCodeEnum) {
        return error(responseCodeEnum.getCode(), responseCodeEnum.getMsg());
    }

    /**
     * 创建一个表示错误响应的方法，允许自定义错误状态码和消息
     *
     * @param <T>  数据类型泛型，允许返回任意类型的响应数据
     * @param code 自定义的错误状态码
     * @param msg  自定义的错误消息
     * @return 包含自定义错误状态码和消息的响应对象
     */
    public static <T> ResponseBaseData<T> error(int code, String msg) {
        ResponseBaseData<T> responseBaseData = new ResponseBaseData<>();
        responseBaseData.setCode(code);
        responseBaseData.setMsg(msg);
        return responseBaseData;
    }

}
